// $Id: env.h,v 1.4 2006-09-11 07:42:28 nicolasw Exp $

#ifndef ENV_H
#define ENV_H

#include "rbtree.h" /* arbol rojo-negro de entradas del entorno */
#include <stdbool.h>


/*TAD Env
 *
 * Implementa un tipo algebraico f:Cadena -> Cadena
 * usando un arbol balanceado de busqueda rojo-negro
 * 
 * Las operaciones basicas son definir, aplicar e indefinir
 * un punto del dominio.
 *
 */

/* Un entorno es un arbol rojo-negro */
//typedef struct rbtree* env;
#define env struct env_s*

/* Crea un entorno vacio */
env env_create(void);

/* Destruye, libera toda la memoria de una entorno, devuelve NULL */
void env_destroy(env e);

/* Tama#o del dominio definido */
unsigned int env_size(const env e);

/* Asignar VALOR a CLAVE en el entorno.  Si REEMPLAZAR es verdadero
 * se reemplaza el valor de CLAVE por el dado en caso de ya estar definido.
 */
void env_set(env e, const char* key, const char* value, const bool replace);

/* Devuelve un puntero a la entrada del entorno interno que contiene el valor
 * de la CLAVE.  Devuelve (null) si el entorno no contiene la CLAVE.
 * ** No hay que modificar este puntero **
 * La estructura NO puede cambiar, luego no hay nuevo entorno para devolver
 */
char* env_get(const env e, const char* key);

/* Elimina la entrada CLAVE del entorno
 * Si no hay entrada con CLAVE, no la elimina.
 */
void env_unset(env e, const char* key);

/* Elimina todas las entradas del entorno
 */
void env_clear(env e);

#endif
